﻿using System;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace HistogramLr.Models
{
	/// <summary>
	/// オリジナル画像とサムネイル画像を格納するクラス。
	/// </summary>
	public class ImageItem
	{
		/// <summary>
		/// オリジナル画像の取得.
		/// </summary>
		public WriteableBitmap BmpOriginal
		{
			get;
			private set;
		}

		/// <summary>
		/// サムネイル画像の取得.
		/// </summary>
		public WriteableBitmap BmpThumbnail
		{
			get;
			private set;
		}

		/// <summary>
		/// Constructor.
		/// </summary>
		/// <param name="imgSrc">元画像</param>
		/// <param name="thumbSize">サムネイルの長辺サイズ</param>
		public ImageItem(IplImage imgSrc, int thumbSize)
		{
			this.BmpOriginal = WriteableBitmapConverter.ToWriteableBitmap(imgSrc);
			this.createThumbnail(imgSrc, thumbSize);
		}

		/// <summary>
		/// サムネイルを生成する。
		/// </summary>
		/// <param name="imgSrc">元画像</param>
		/// <param name="thumbSize">サムネイルの長辺サイズ</param>
		private void createThumbnail(IplImage imgSrc, int thumbSize)
		{
			// 指定サムネイルサイズからスケールを計算
			int longSideSize = Math.Max(imgSrc.Width, imgSrc.Height);
			double scale = (double)thumbSize / (double)longSideSize;

			// サムネイル生成
			int thumbWidth = (int)Math.Round((double)imgSrc.Width * scale);
			int thumbHeight = (int)Math.Round((double)imgSrc.Height * scale);
			using (IplImage imgThumb = new IplImage(thumbWidth, thumbHeight, imgSrc.Depth, imgSrc.NChannels))
			{
				Cv.Resize(imgSrc, imgThumb, Interpolation.Lanczos4);

				// 黒つぶれ、白飛びの描画
				//for (int y = 0; y < thumbHeight; y++)
				//{
				//    for (int x = 0; x < thumbWidth; x++)
				//    {
				//        int idx = thumbWidth * y + x;
				//        CvScalar sc = imgThumb.Get1D(idx);
				//        if (sc.Val0 == 0 && sc.Val1 == 0 && sc.Val2 == 0)
				//        {
				//            imgThumb.Set1D(idx, new CvScalar(0xFF, 0x00, 0x00, 0xff));
				//        }
				//    }
				//}

				this.BmpThumbnail = WriteableBitmapConverter.ToWriteableBitmap(imgThumb);
			}
		}

		private Color getPixel(WriteableBitmap bmp, double x, double y)
		{
			// 範囲チェック（範囲外なら透明色を返す）
			if (bmp.PixelWidth <= x || bmp.PixelHeight <= y) return Colors.Transparent;

			using (IplImage img = WriteableBitmapConverter.ToIplImage(bmp))
			{
				CvScalar sc = img.Get1D(img.Width * (int)y + (int)x);
				byte r = (byte)sc.Val2;
				byte g = (byte)sc.Val1;
				byte b = (byte)sc.Val0;
				return Color.FromArgb(0xff, r, g, b);
			}
		}

		public Color GetThumbColor(double x, double y)
		{
			// NULLなら透明色を返す.
			return this.getPixel(this.BmpThumbnail, x, y);
		}
	}
}
